package com.cook.controller;

import com.cook.dto.admin.AdminLoginDTO;
import com.cook.dto.admin.AdminRegisterDTO;
import com.cook.dto.user.UserLoginDTO;
import com.cook.dto.user.UserRegisterDTO;
import com.cook.entity.Admin;
import com.cook.entity.User;
import com.cook.properties.JwtProperties;
import com.cook.result.Result;
import com.cook.service.LoginService;
import com.cook.utils.JwtUtil;
import com.cook.vo.admin.AdminLoginResultVO;
import com.cook.vo.user.UserLoginResultVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@RestController
@Slf4j
@RequestMapping("/login")
public class LoginController {

    @Autowired
    private LoginService loginService;

    @Autowired
    private JwtProperties jwtProperties;

    @Autowired
    private JwtUtil jwtUtil;

    /**
     * 用户登录
     */
    @PostMapping("/user")
    public Result<UserLoginResultVO> login(@RequestBody UserLoginDTO dto) {
        log.info("用户登录：{}", dto); // 添加日志

        // 参数验证
        if (dto.getAccount() == null || dto.getPassword() == null) {
            return Result.error("账号和密码不能为空");
        }

        try {
            User user = loginService.getUser(dto);
            if (user == null) {
                return Result.error("账号或密码错误");
            }

            // 登录成功后，生成jwt令牌
            Map<String, Object> claims = new HashMap<>();
            claims.put("userId", user.getUserId().toString());
            // 使用示例中的 JWT 生成方式
            String token = jwtUtil.createJWT(
                    jwtProperties.getUserSecretKey(),  // 用户密钥
                    jwtProperties.getUserTtl(),        // 用户token过期时间
                    claims
            );

            // 构建返回结果
            UserLoginResultVO result = UserLoginResultVO.builder()
                    .userId(user.getUserId())
                    .account(user.getAccount())
                    .name(user.getUsername())
                    .token(token)
                    .build();

            return Result.success(result);

        } catch (Exception e) {
            log.error("用户登录异常：", e);
            return Result.error("登录异常: " + e.getMessage());
        }
    }

    /**
     * 用户注册
     */
    @PostMapping("/user/register")
    public Result<Long> register(@RequestBody UserRegisterDTO dto) {
        log.info("用户注册：{}", dto); // 添加日志

        // 参数验证
        if (dto.getAccount() == null || dto.getPassword() == null) {
            return Result.error("账号和密码不能为空");
        }

        try {
            Long userId = loginService.addUser(dto);
            return Result.success(userId);
        } catch (Exception e) {
            log.error("用户注册异常：", e);
            return Result.error("注册异常: " + e.getMessage());
        }
    }

    /**
     * 管理员登录
     */
    @PostMapping("/admin")
    public Result<AdminLoginResultVO> login(@RequestBody AdminLoginDTO dto) {
        log.info("管理员登录：{}", dto.getAccount());

        // 参数验证
        if (dto.getAccount() == null || dto.getPassword() == null) {
            return Result.error("账号和密码不能为空");
        }

        try {
            Admin admin = loginService.getAdmin(dto);

            // 生成JWT令牌
            Map<String, Object> claims = new HashMap<>();
            claims.put("adminId", admin.getAdminId().toString());
            claims.put("account", admin.getAccount());
            claims.put("type", "admin"); // 标识管理员类型

            String token = jwtUtil.createJWT(
                    jwtProperties.getAdminSecretKey(),  // 管理员密钥（与用户分开）
                    jwtProperties.getAdminTtl(),        // 管理员token过期时间
                    claims
            );

            // 构建返回结果
            AdminLoginResultVO result = AdminLoginResultVO.builder()
                    .adminId(admin.getAdminId())
                    .account(admin.getAccount())
                    .name(admin.getUsername() != null ? admin.getUsername() : admin.getAccount())
                    .token(token)
                    .build();

            log.info("管理员登录成功：adminId={}", admin.getAdminId());
            return Result.success(result);

        } catch (RuntimeException e) {
            log.warn("管理员登录失败：{} - {}", dto.getAccount(), e.getMessage());
            return Result.error(e.getMessage());
        } catch (Exception e) {
            log.error("管理员登录异常：", e);
            return Result.error("登录异常: " + e.getMessage());
        }
    }

    /**
     * 管理员注册
     */
    @PostMapping("/admin/register")
    public Result<AdminLoginResultVO> register(@RequestBody AdminRegisterDTO dto) {
        log.info("管理员注册：{}", dto.getAccount());

        // 参数验证
        if (dto.getAccount() == null || dto.getPassword() == null) {
            return Result.error("账号和密码不能为空");
        }

        try {
            // 注册管理员
            Long adminId = loginService.addAdmin(dto);

            // 注册成功后自动登录
            AdminLoginDTO loginDTO = new AdminLoginDTO();
            loginDTO.setAccount(dto.getAccount());
            loginDTO.setPassword(dto.getPassword());

            Admin admin = loginService.getAdmin(loginDTO);

            // 生成JWT令牌
            Map<String, Object> claims = new HashMap<>();
            claims.put("adminId", admin.getAdminId().toString());
            claims.put("account", admin.getAccount());
            claims.put("type", "admin");

            String token = jwtUtil.createJWT(
                    jwtProperties.getAdminSecretKey(),
                    jwtProperties.getAdminTtl(),
                    claims
            );

            // 构建返回结果
            AdminLoginResultVO result = AdminLoginResultVO.builder()
                    .adminId(admin.getAdminId())
                    .account(admin.getAccount())
                    .name(admin.getUsername() != null ? admin.getUsername() : admin.getAccount())
                    .token(token)
                    .build();

            log.info("管理员注册并登录成功：adminId={}", admin.getAdminId());
            return Result.success("注册成功", result);

        } catch (RuntimeException e) {
            log.warn("管理员注册失败：{} - {}", dto.getAccount(), e.getMessage());
            return Result.error(e.getMessage());
        } catch (Exception e) {
            log.error("管理员注册异常：", e);
            return Result.error("注册异常: " + e.getMessage());
        }
    }

    /**
     * 退出登录（JWT是无状态的，前端清除token即可）
     */
    @PostMapping("/logout")
    public Result<Boolean> logout() {
        log.info("退出登录");

        return Result.success("退出成功", true);
    }

}